package main

import (
	"encoding/json"
	"fmt"
)

/*
1、介绍
json反序列化是指，将json字符串反序列化成对应的数据类型（比如结构体、map、切片）的操作

*/
type Monster struct {
	Name     string
	Age      int
	Birthday string
	Sal      float64
	Skill    string
}

//演示将json字符串反序列化成struct
func unmarshalStruct() {
	//说明str在项目开发中是通过网络传输获取到。。。或者是读取文件获取到。。。
	//双引号里有双引号需要转义处理或者使用反引号
	str := `{"Name":"牛魔王","Age":500,"Birthday":"2021-08-04","Sal":8000,"Skill":"牛魔拳"}`
	//定义一个Monster实例
	var monster Monster
	err := json.Unmarshal([]byte(str), &monster)
	if err != nil {
		fmt.Printf("unmarsh err=%v\n", err)
	}
	fmt.Printf("反序列化后monster=%v monster.Name=%v\n", monster, monster.Name)
}

//演示将json字符串，反序列化成map
func unmarshalMap() {
	str := `{"address":"洪崖洞","age":30,"name":"红孩儿"}`
	//定义一个map
	var a map[string]interface{}
	//反序列，这里不需要make，因为make操作被封装到Unmarshal函数
	err := json.Unmarshal([]byte(str), &a)
	if err != nil {
		fmt.Printf("unmarsh err=%v\n", err)
	}
	fmt.Printf("反序列化后a=%v\n", a)
}

//演示将json字符串反序列成切片
func unmarshalSlice() {
	str := `[{"address":"武汉","age":7,"name":"jack"},{"address":["天门","武汉"],"age":20,"name":"tom"}]`
	//定义一个slice
	var slice []map[string]interface{}
	//反序列化，不需要make，因为make操作被封装到Unmarshal函数
	err := json.Unmarshal([]byte(str), &slice)
	if err != nil {
		fmt.Printf("unmarsh err=%v\n", err)
	}
	fmt.Printf("反序列化后slice=%v\n", slice)
}
func main() {
	unmarshalStruct()
	unmarshalMap()
	unmarshalSlice()
	/*
		小结：
		(1)在反序列化一个json字符串时，要确保反序列化后的数据类型和原来序列化前的数据类型一致
		(2)如果json字符串是通过程序获取到的，则不需要再对字符串转义处理
	*/
}
